{#
  jinjia2模板文件
  主/镜像服务器出站设置sql模板文件
#}
/*
  {{ target_name }}服务器出站设置,以sa用户或其他拥有系统管理员权限的用户登录执行

  !!!特别注意:!!!
  
  将在{{ target_name }}数据库实例里删除：

  1. 名为{{ cert_name }}的证书
  2. 名为{{ endpoint_name }}的数据库镜像端点

  确保 {{ cert_file_path}} 文件执行前不存在，完成后，将该文件拷贝到{{ counter_name }}服务器上,
  {{ cert_dir_path}}\是假定的证书输出位置

  新建的数据库镜像端点{{ endpoint_name }}使用默认的端口号{{ port }}，可以调整为其他端口号，
  并注意在防火墙允许该端口接受连接。

*/
{% if master_key_password %}
-- 产生主加密秘钥
IF NOT EXISTS (SELECT name FROM sys.symmetric_keys WHERE name='##MS_DatabaseMasterKey##')
   BEGIN
      PRINT '产生主加密秘钥'
      --
      -- !!!!填写自己的密码!!!!
      CREATE MASTER KEY ENCRYPTION BY PASSWORD = '{{ master_key_password }}';  
   END
{% endif %}
{% if cert_name %}
-- 产生证书
IF NOT EXISTS (SELECT name FROM sys.certificates WHERE name='{{ cert_name }}')
   BEGIN
      PRINT '产生{{ target_name }}服务器证书{{ cert_name }}'
      CREATE CERTIFICATE  {{ cert_name }}
         WITH SUBJECT = '主数据库服务器证书',   
         EXPIRY_DATE = '{{ expiry_date }}';  
   END
ELSE
   BEGIN
      PRINT '证书{{ cert_name }}已存在,如果证书已经过期,请手动删除(drop certificate {{ cert_name }}),然后重新运行这个sql。'
   END
{% endif %}
--
-- 产生拥有数据库镜像端点
IF NOT EXISTS (SELECT name FROM sys.endpoints WHERE name='{{ endpoint_name }}')
   BEGIN
      PRINT '产生数据库镜像的端点{{ endpoint_name }},该端点端口号{{ port }},由{{ cert_name }}认证加密'
      CREATE ENDPOINT {{ endpoint_name }}  
         STATE = STARTED  
         AS TCP (  
            -- 端口号，不能与镜像数据库的端点端口相同
            LISTENER_PORT={{ port }}
            , LISTENER_IP = ALL  
         )   
         FOR DATABASE_MIRRORING (   
            -- 使用证书加密端点
            AUTHENTICATION = CERTIFICATE {{ cert_name }}  
            , ENCRYPTION = REQUIRED ALGORITHM AES  
            , ROLE = ALL  
         );  
   END
ELSE
   BEGIN
      PRINT '名为{{ endpoint_name }}的数据库镜像端点已存在,修改该端点的属性.'
      ALTER ENDPOINT {{ endpoint_name }} 
      STATE = STARTED  
         AS TCP (  
            -- 端口号，不能与镜像数据库服务器的端点端口相同
            LISTENER_PORT={{ port }}
            , LISTENER_IP = ALL  
         )   
      FOR DATABASE_MIRRORING (   
         -- 使用证书认证加密端点
         AUTHENTICATION = CERTIFICATE {{ cert_name }}  
         , ENCRYPTION = REQUIRED ALGORITHM AES  
         , ROLE = ALL  
      );  
   END

--
-- 备份证书到硬盘
PRINT '备份证书{{ cert_name }}到{{ cert_file_path }},确保该文件操作前不存在,操作完成后将该证书文件拷贝到{{ counter_name }}服务器'
BACKUP CERTIFICATE {{ cert_name }} TO FILE = '{{ cert_file_path}}';  
PRINT '操作已完成，返回jupyter笔记本继续执行下面根据提示继续操作。Ok'


